﻿using System;
using System.Collections.Generic;
using Inventione.Framework.BusinessLogic;
using Inventione.Framework.BusinessLogic.Exceptions;
using Inventione.Outsourcing.DataAccess;
using Inventione.Outsourcing.DataLinq;

namespace Inventione.Outsourcing.BusinessLogic
{
    public class BLFeriado : BLBase
    {

        // Representa o objeto de acesso a dados
        private DAFeriado daFeriado = null;

        /// <summary>
        /// Construtor padrão
        /// </summary>
        public BLFeriado()
            : base("DEFAULT")
        {
            daFeriado = new DAFeriado("DEFAULT");
        }

        /// <summary>
        /// Construtor utilizando o cliente
        /// </summary>
        /// <param name="tenantId">Identificador do cliente</param>
        public BLFeriado(string tenantId):base(tenantId)
        {
            daFeriado = new DAFeriado(tenantId);  
        }

        /// <summary>
        /// Consulta feriados (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="dsFeriado">Descrição do feriado</param>
        /// <param name="dhInicio">Data de início do feriado</param>
        /// <param name="dhFim">Data fim do feriado</param>
        /// <param name="inTipo">Tipo de feriado (A-Anual / D-Determinado)</param>
        /// <param name="inAtivo">Indicador se está ativo ou inativo (S/N)</param>
        /// <param name="maximumRows">Quantidade máxima de linhas de retorno</param>
        /// <param name="startRowIndex">Linha inicial de retorno</param>
        /// <param name="sortExpression">Compo para ordenação</param>
        /// <returns>Lista de feriados</returns>
        public List<FERIADO> consultarFeriados(string dsFeriado, DateTime? dhInicio, DateTime? dhFim, 
            string inTipo, string inAtivo, int maximumRows, int startRowIndex, string sortExpression)
        {
            List<FERIADO> retorno = null;

            try
            {
                retorno = this.daFeriado.consultarFeriados(dsFeriado, dhInicio, dhFim, inTipo, inAtivo, 
                    maximumRows, startRowIndex, sortExpression);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Consulta feriados (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="dsFeriado">Descrição do feriado</param>
        /// <param name="dhInicio">Data de início do feriado</param>
        /// <param name="dhFim">Data fim do feriado</param>
        /// <param name="inTipo">Tipo de feriado (A-Anual / D-Determinado)</param>
        /// <param name="inAtivo">Indicador se está ativo ou inativo (S/N)</param>
        /// <returns>Quantidade de registros atingidos pela consulta</returns>
        public int consultarFeriadosCount(string dsFeriado, DateTime? dhInicio, DateTime? dhFim, string inTipo, string inAtivo)
        {
            int retorno = 0;

            try
            {
                retorno = daFeriado.consultarFeriadosCount(dsFeriado, dhInicio, dhFim, inTipo, inAtivo);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem um feriado
        /// </summary>
        /// <param name="cdFeriado">Código do feriado</param>
        /// <returns>Enteidade feriado</returns>
        public FERIADO obterFeriado(int cdFeriado)
        {
            FERIADO retorno = null;

            try
            {
                retorno = daFeriado.obterFeriado(cdFeriado);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem um feriado
        /// </summary>
        /// <param name="cdFeriado">Código do feriado</param>
        /// <returns>Lista contendo um feriado</returns>
        public List<FERIADO> listarFeriado(int cdFeriado)
        {
            List<FERIADO> retorno = null;

            try
            {
                retorno = this.daFeriado.listarFeriado(cdFeriado);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        #region Métodos básicos - CRUD

        /// <summary>
        /// Insere um feriado
        /// </summary>
        /// <param name="entity">Entidade feriado</param>
        /// <returns>Código do feriado</returns>
        public int inserirFeriado(FERIADO entity)
        {
            int retorno = 0;

            try
            {
                retorno = this.daFeriado.inserirFeriado(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Atualiza os dados de um feriado
        /// </summary>
        /// <param name="entity">Entidade feriado</param>
        public void atualizarFeriado(FERIADO entity)
        {
            try
            {
                this.daFeriado.atualizarFeriado(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        /// <summary>
        /// Exclui um feriado
        /// </summary>
        /// <param name="entity">Entidade feriado</param>
        public void excluirFeriado(FERIADO entity)
        {
            try
            {
                this.daFeriado.excluirFeriado(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        #endregion
    }

}
